package cn.buk.qms.service;

import cn.buk.common.JsonResult;
import cn.buk.common.dto.CommonDto;
import cn.buk.common.flight.dto.FlightInfoDto;
import cn.buk.tms.dto.AuthInfo;
import cn.buk.tms.dto.FlightOrderPassengerDto;
import cn.buk.tms.dto.FlightOrderStatusStat;
import cn.buk.tms.dto.ItineraryInfo;
import cn.buk.tms.entity.order.flight.FlightOrderExternal;
import cn.buk.tms.entity.order.flight.FlightOrderPassenger;
import cn.buk.tms.entity.misc.OperationLog;
import cn.buk.tms.entity.order.OrderAttachment;
import cn.buk.tms.exception.BaseException;
import cn.buk.tms.flight.dto.*;
import cn.buk.tms.sc.SearchFlightOrderCriteria;
import cn.buk.tms.flight.request.FlightOrderRequestDto;
import cn.buk.tms.flight.dto.response.FlightOrderResponseDto;

import java.text.ParseException;
import java.util.Date;
import java.util.List;

/**
 * @author yfdai
 * @date 2015-3-19
 */
public interface FlightOrderService {

  /**
   * 创建机票订单
   *
   * @param enterpriseId 用户所属企业enterpriseId
   * @param username     当前用户名
   * @param dto          保存的对象
   */
  JsonResult createFlightOrder(int enterpriseId, String username, FlightOrderRequestDto dto);

  /**
   * 查找机票订单
   */
  List<FlightOrderResponseDto> searchFlightOrders(int enterpriseId, int userId, String username, SearchFlightOrderCriteria sc);

  CommonDto<FlightOrderResponseDto> searchFlightOrders2(int enterpriseId, int userId, String username, SearchFlightOrderCriteria sc);

  List<OperationLog> searchFlightOrderHistory(int enterpriseId, int orderId);

  /**
   * 搜索需要送票的机票订单
   */
  List<FlightOrderResponseDto> searchNeedDeliveryFlightOrders(int enterpriseId, int userId, SearchFlightOrderCriteria sc);

  /**
   * 获取订单详情
   */
  FlightOrderResponseDto getFlightOrderDetail(int enterpriseId, int userId, int orderId);

  FlightOrderResponseDto getFlightOrderDetailByOrderNo(int enterpriseId, int userId, String orderNo);

  /**
   * 修改机票订单价格
   *
   * @param enterpriseId 企业id
   * @param orderId      订单id
   * @param dto          要修改的价格内容
   */
  JsonResult updateFlightOrderPrice(int enterpriseId, String username, int orderId, FlightOrderRequestDto dto);

  JsonResult updateFlightOrderPassenger(AuthInfo authInfo, FlightOrderPassengerDto psgDto);


  JsonResult updateFlightOrderPnr(int enterpriseId, String username, int orderId, String pnrNo);

  /**
   * 修改机票订单的大客户代码
   */
  JsonResult updateFlightOrderKeyCustomerNo(int enterpriseId, String username, int orderId, String keyCustomerNo);

  /**
   * 取消机票订单
   * @param enterpriseId 当前用户的enterpriseId
   * @param username     当前用户的username
   * @param orderId      订单id
   * @param reasonCode   取消理由的代码
   * @param reasonDesc   取消理由
   */
  JsonResult cancelFlightOrder(int enterpriseId, String username, int orderId, int reasonCode, String reasonDesc);

  /**
   * 申请开票
   */
  JsonResult submitFlightOrder(int enterpriseId, String username, int orderId);

  /**
   * 机票订单 审批通过
   *
   */
  JsonResult approveFlightOrder(int enterpriseId, String username, int orderId);

  /**
   * 认领开票，我来开票
   */
  JsonResult toTicketFlightOrder(int enterpriseId, String username, int orderId);

  /**
   * 取消认领
   */
  JsonResult cancelClaimFlightOrder(int enterpriseId, String username, int orderId);

  JsonResult finishFlightOrder(int enterpriseId, String username, int orderId, Date etdzDate);

  /**
   * 修改机票订单的开票设置
   */
  JsonResult updateFlightOrderTicketOptions(int enterpriseId, String username, int orderId, int supplierId, int paymentMethodId, int autoTicket, int price);

  /**
   * 修改机票订单的支付方式
   */
  JsonResult updateFlightOrderPaymentMethod(int enterpriseId, String username, int orderId, int paymentMethodId);

  /**
   * 修改机票订单的派送日期
   */
  JsonResult updateFlightOrderDeliveryDate(int enterpriseId, String username, int orderId, Date deliveryDate);

  /**
   * 修改机票订单的出票员
   */
  JsonResult updateFlightOrderTicketer(int enterpriseId, String username, int orderId, String ticketer);

  /**
   * 为订单回填票号
   */
  JsonResult updateFlightOrderTicketNo(int enterpriseId, String username, int orderId, List<FlightOrderPassenger> passengers);

  JsonResult delFlightOrderExtra(int enterpriseId, String username, int orderId, int extraId);

  /**
   * 同意机票订单取消请求
   *
   * @param enterpriseId 当前用户的enterpriseId
   * @param username     当前用户的username
   * @param orderId      机票订单的id
   * @param requestId    机票订单取消请求的id
   */
  JsonResult agreeFlightOrderCancelRequest(int enterpriseId, String username, int orderId, int requestId);

  /**
   * 拒绝机票订单取消请求
   *
   * @param enterpriseId 当前用户的enterpriseId
   * @param username     当前用户的username
   * @param orderId      机票订单的id
   * @param requestId    机票订单取消请求的id
   * @param reasonCode   拒绝的理由代码
   * @param reasonDesc   拒绝的理由描述
   */
  JsonResult denyFlightOrderCancelRequest(int enterpriseId, String username, int orderId, int requestId, int reasonCode, String reasonDesc);

  /**
   * 行程单已邮寄
   */
  JsonResult finishFlightOrderItineraryDelivery(int enterpriseId, String username, int orderId, String remark);


  JsonResult incFlightOrderPrintCount(int enterpriseId, String username, int orderId);

  /**
   * 发送短信
   *
   * @param enterpriseId 企业id
   * @param username     用户名
   * @param orderId      订单id
   * @param psgId        乘机人id
   * @param mobileNo     手机号
   * @param smsContent   短信内容
   * @param smsFormat    短信内容使用格式
   */
  JsonResult sendFlightOrderSms(int enterpriseId, String username, int orderId, int psgId, String mobileNo, final String smsContent, final int smsFormat);

  /**
   * 获取系统生成的短信内容
   *
   */
  JsonResult getFlightOrderSmsContent(int enterpriseId, String username, int orderId, int psgId, int smsFormat);

  /**
   * 发送开票审批短信
   *
   */
  JsonResult sendFlightOrderApprovalSms(int enterpriseId, String username, int orderId, String mobileNo, String smsContent);

  /**
   * 获取系统生成的 申请开票验证的短信内容
   *
   */
  JsonResult getFlightOrderApprovalSmsContent(int enterpriseId, String username, int orderId);


  JsonResult updateFlightOrderCustomer(int enterpriseId, String username, int orderId, int customerId, String costCenter);


  JsonResult updateFlightOrderIntlTicket(int enterpriseId, String username, int orderId, int intlTicket);

  FlightOrderStatusStat statFlightMiscOrderStatus(int enterpriseId);

  ItineraryInfo createItineraryByFlightOrder(final int enterpriseId, final int orderId);


  /**
   * 检查需要分配审批人的机票订单，如果有，就分配
   * <p>
   * 1、企业客户提交的订单；
   * 2、根据订单提交时的用户名进行判断；
   * 3、根据用户名查找所属部门（用户名通过passenger_id与企业员工资料相关联）；
   * 4、若找到部门，并且该部门设置了审批人，则从这些审批人中按照规则选择一个；
   * 5、若找到部门，并且该部门未设置审批人，则找上级部门，重复步骤4。
   *
   */
  void checkFlightOrderNeedApprover(int enterpriseId, String agentName);

  /**
   * 检查机票订单是否符合差旅政策
   *
   */
  void checkFlightOrderMeetPolicy(final int enterpriseId, final String username);

  /**
   * 自动取消“待提交”状态的客户自助下的订单
   */
  void checkFlightOrderStatus(int enterpriseId, String agentName) throws ParseException;

  /**
   * 机票订单出票完成后， 刷新PNR内容
   *
   */
  void refreshFlightOrderPnrDetail(int enterpriseId, String agentName);

  /**
   * 机票订单出票完成后，刷新票号的DETR内容
   */
  void refreshFlightOrderDetrDetail(int enterpriseId, String agentName);

  /**
   * 重新检查机票订单中的DETR信息
   */
  void recheckFlightOrderDetrInfo(int enterpriseId, String username);

  /**
   * 通过编码或编码内容直接生成机票订单
   */
  JsonResult createFlightOrderByPnrDetail(int enterpriseId, String username, String pnrDetail);

  /**
   * 校验机票销售业务规则
   */
  void validateFlightBusinessRule(int enterpriseId, String username);

  /**
   * 确认已读机票订单的通知
   */
  JsonResult confirmFlightOrderNotice(int enterpriseId, String username, int orderId);

  /**
   * 检查机票订单的显示状态
   */
  void checkFlightOrderShowStatus(int enterpriseId, String username);

  JsonResult saveFlightOrderAttachment(int enterpriseId, String username, int orderId,
                                       int orderType, List<OrderAttachment> attachments);

  /**
   * 检查是否有新的机票订单（客户自助下单）需要通知客服部门
   */
  void checkFlightOrderNotifyStatus(int enterpriseId, String username);



  /**
   * 为机票订单上传乘机人
   */
  JsonResult uploadPassenger4FlightOrder(int enterpriseId, String username, int orderId, String filePath);

  /**
   * NDC确认价格
   */
  FlightOfferPrice checkFlightOrderPrice(int enterpriseId, String username, int orderId);

  /**
   * CZ NDC 确认价格后生成订单
   */
  JsonResult confirmFlightOrderPrice(int enterpriseId, String username, int orderId, String shoppingResponseId,
                                     List<String> itemCodes);

  /**
   * NDC 机票状态同步
   */
  JsonResult syncFlightOrderStatus(int enterpriseId, String username, int orderId, int actMode) throws BaseException;

  /**
   * 同步外部订单的状态
   * @param enterpriseId 企业id
   * @param username 用户名
   * @param externalOrderId 外部订单的id
   * @return 核对结果
   */
  JsonResult syncExternalOrderStatus(int enterpriseId, String username, int externalOrderId) throws BaseException;

  /**
   * CZ NDC 订单支付
   */
  JsonResult payForFlightOrder(int enterpriseId, String username, int orderId);

  /**
   * CZ NDC 查找可用的优惠券
   */
  FlightCouponInfo searchFlightOrderCoupons(AuthInfo authInfo, int orderId);


  /**
   * 修改机票订单的某个属性
   * @param propertyName 属性名称
   * @param propertyValue 属性值
   */
  JsonResult updateFlightOrderProperty(int enterpriseId, String username, int orderId, String propertyName, String propertyValue);

  /**
   * 查询退票费
   */
  FlightRefundFee queryOrderRefundFee(int enterpriseId, String username, int orderId);

  /**
   * 修改机票订单的供应商类型(自动出票）
   */
  JsonResult updateFlightOrderSupplierType(int enterpriseId, String username, int orderId, int supplierType);

  /**
   * 查询改签航班
   * @param flightSearchCriteria 新航班的查询条件
   */
  CommonDto<FlightInfoDto> queryOrderChange(int enterpriseId, String username, int orderId, List<FlightSearchCriteria> flightSearchCriteria);

  /**
   * 增加机票订单的日志
   */
  void appendFlightOrderLog(int enterpriseId, String username, int orderId, String remark);

  /**
   * 创建外部订单（调用接口）
   * @param enterpriseId 当前用户企业id
   * @param username 当前用户名
   * @param orderId 机票订单id
   * @param supplierId 供应商id
   * @return 调用结果
   */
  JsonResult createExternalFlightOrder(int enterpriseId, String username, int orderId, int supplierId) throws BaseException;

  /**
   * 外部订单确认开票
   * @param enterpriseId 当前用户企业id
   * @param username 当前用户名
   * @param externalOrderId 机票外部订单id
   * @return 调用结果
   */
  JsonResult confirmExternalFlightOrder(int enterpriseId, String username, int externalOrderId);

  List<FlightExternalOrderDto> searchExternalFlightOrders(int enterpriseId, String username, int orderId);
}
